package com.itheima.mp.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 通过继承ServiceImpl<UserMapper, User>并实现IUserService接口，既获得了MyBatis-Plus提供的通用CRUD实现，又能扩展自定义业务逻辑
 */

/**
 * 继承ServiceImpl:
 * ServiceImpl<UserMapper, User>是MyBatis-Plus提供的通用服务实现类，内部已经实现了IService接口的所有方法（如save、update、list等），并通过baseMapper属性关联了UserMapper，无需手动注入UserMapper。
 * 实现IUserService:
 * 使该类能被Spring容器管理，同时可以在IUserService中定义自定义方法，在这里实现。
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    /**
     * 根据id扣减用户余额
     * @param id
     * @param money
     */
    @Override
    public void deductBalance(Long id, Integer money) {
        //1.先根据id拿到用户信息
        //因为继承了ServiceImpl<UserMapper, User>，打开源码，发现里面已经注入了baseMapper注解，所以这里就不要在写@Autowired注解，把UserMapper注入了
        //打开UserMapper发现其继承了baseMapper，在baseMapper中已经封装了大量的增删改查方法
        //所以这里直接这样查用户信息更加简介
        User user = getById(id);
        //2.校验用户的状态
        if (user.getStatus() == 1){
            Integer balance = user.getBalance();
            if (balance < money){
                throw new RuntimeException("用户余额不足!");
            }else {
                //3.执行扣减余额操作
                //因为baseMapper中没有扣减余额的方法，所以这里得去自定义方法
                baseMapper.deductBalacce(id,money);
            }
        } else if (user.getStatus() == 2 || user == null) {
            throw new RuntimeException("用户状态异常!");
        }
    }

    /**
     * 根据复杂条件查询用户接口
     * @param name
     * @param status
     * @param minBalance
     * @param maxBalance
     * @return
     */
    //使用MyBatis-Plus的Lambda条件构造器实现用户多条件的查询
    @Override
    public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
        List<User> users = lambdaQuery()
                .like(name != null, User::getUsername,name) //用户名非空则模糊查询
                .eq(status != null, User::getStatus,status) //状态非空则精确匹配
                .ge(minBalance != null, User::getBalance,minBalance)  //最小余额非空则>=
                .le(maxBalance != null, User::getBalance,maxBalance) //最大余额非空则<=
                .list(); //执行查询并返回list列表(因为返回结果是list集合类型)
        return users;
    }

}
